Today is
Sys.time()
[1] "2020-09-10 14:37:14 +07"
Loading COVID-19 dataset
library(dplyr)
library(ggplot2)
library(plotly)
set.seed(1234)
filename <- "covid.csv"
#if (!file.exists(filename)) {
download.file("https://covid.ourworldindata.org/data/owid-covid-data.csv", destfile = filename)
#}
covid_raw <- read.csv("covid.csv", header = T)
covid <- covid_raw
Fix total_cases
covid$date <- as.Date(covid$date)
covid$total_cases_fixed <- sapply(1:nrow(covid), function (n) {
label <- "total_cases"
x <- covid[[label]][n]
if (is.na(x)) {
this_loc <- subset(covid, location == covid$location[n])
m <- mean(c(
max(0, subset(this_loc, date < covid$date[n])[[label]], na.rm = T),
min(max(covid[[label]], na.rm = T), subset(this_loc, date > covid$date[n])[[label]], na.rm = T)
))
if (is.na(m)) {
return(0)
}
return(m)
}
return(x)
})
select(subset(covid, location == "Thailand"), location, date, total_cases, total_cases_fixed)
Fix total_cases_per_million
covid$total_deaths_per_million_fixed <- sapply(1:nrow(covid), function (n) {
label <- "total_deaths_per_million"
x <- covid[[label]][n]
if (is.na(x)) {
this_loc <- subset(covid, location == covid$location[n])
m <- mean(c(
max(0, subset(this_loc, date < covid$date[n])[[label]], na.rm = T),
min(max(covid[[label]], na.rm = T), subset(this_loc, date > covid$date[n])[[label]], na.rm = T)
))
if (is.na(m)) {
return(0)
}
return(m)
}
return(x)
})
covid$total_cases_per_million_fixed <- sapply(1:nrow(covid), function (n) {
label <- "total_cases_per_million"
x <- covid[[label]][n]
if (is.na(x)) {
this_loc <- subset(covid, location == covid$location[n])
m <- mean(c(
max(0, subset(this_loc, date < covid$date[n])[[label]], na.rm = T),
min(max(covid[[label]], na.rm = T), subset(this_loc, date > covid$date[n])[[label]], na.rm = T)
))
if (is.na(m)) {
return(0)
}
return(m)
}
return(x)
})
select(subset(covid, location == "Thailand"), location, date, total_deaths_per_million, total_deaths_per_million_fixed)
Max total cases, as of now
distinct_loc <- covid %>% distinct(location, .keep_all = T)
total_cases_lookup <- distinct_loc$total_cases
names(total_cases_lookup) <- distinct_loc$location
max_total_cases_lookup <- sapply(distinct_loc$location, function (loc) {
this_loc <- subset(covid, location == loc)
return(max(0, this_loc$total_cases, na.rm = T))
})
names(max_total_cases_lookup) <- distinct_loc$location
total_cases_per_million_lookup <- distinct_loc$total_cases_per_million
names(total_cases_per_million_lookup) <- distinct_loc$location
max_total_cases_per_million_lookup <- sapply(distinct_loc$location, function (loc) {
this_loc <- subset(covid, location == loc)
return(max(0, this_loc$total_cases_per_million, na.rm = T))
})
names(max_total_cases_per_million_lookup) <- distinct_loc$location
total_deaths_per_million_lookup <- distinct_loc$total_deaths_per_million
names(total_deaths_per_million_lookup) <- distinct_loc$location
max_total_deaths_per_million_lookup <- sapply(distinct_loc$location, function (loc) {
this_loc <- subset(covid, location == loc)
return(max(0, this_loc$total_deaths_per_million, na.rm = T))
})
names(max_total_deaths_per_million_lookup) <- distinct_loc$location
max_total_deaths_per_million_lookup['Thailand']
Thailand
0.831
Day over 100
date_over_100_lookup <- sapply(distinct_loc$location, function (loc) {
this_loc <- subset(covid, location == loc & total_cases_fixed >= 100)
if (length(this_loc$date) > 0) {
return(min(this_loc$date))
}
return(NA)
})
covid$day_over_100 <- sapply(1:nrow(covid), function (n) {
d <- as.Date(covid$date[n]) - date_over_100_lookup[[covid$location[n]]]
if (is.na(d) | d < 0) {
return(NA)
}
return(d)
})
select(subset(covid, !is.na(day_over_100)), location, date, day_over_100) %>% distinct(location, .keep_all = T)
Top N’s
top_ranks <- data.frame(
name = names(max_total_cases_per_million_lookup),
max_total_cases = max_total_cases_lookup,
max_total_cases_per_million = max_total_cases_per_million_lookup,
max_total_deaths_per_million = max_total_deaths_per_million_lookup,
nth_cases = length(max_total_cases_per_million_lookup) - rank(max_total_cases_per_million_lookup) + 1,
nth_deaths = length(max_total_deaths_per_million_lookup) - rank(max_total_deaths_per_million_lookup) + 1
) %>% arrange(desc(max_total_cases_per_million))
top_ranks %>% select(max_total_cases_per_million)
top_ranks %>% arrange(desc(max_total_deaths_per_million)) %>% select(max_total_deaths_per_million)
Thailand ranks
subset(
top_ranks %>% arrange(desc(max_total_cases)),
name %in% (top_ranks %>% arrange(desc(max_total_cases)))$name[2:10] | name == "Thailand"
) %>% select(nth_cases, nth_deaths, max_total_cases_per_million)
Top N, and Thailand, since 100th day
ggplotly(ggplot(
covid %>% subset(!is.na(day_over_100) & new_cases > 0 & (location %in% top_ranks[1:10,]$name | location == "Thailand")),
aes(day_over_100, new_cases_per_million, color = location))
+ geom_line()
+ scale_y_log10()
+ labs(
title = "New cases per million since day over 100 (highest total cases per miliion)",
x = "Day over 100", y = "Number of new cases per million")
)
ggplotly(ggplot(
covid %>% subset(!is.na(day_over_100) & new_cases > 0 & (location %in% top_ranks[1:10,]$name | location == "Thailand")),
aes(day_over_100, new_deaths_per_million, color = location))
+ geom_line()
+ scale_y_log10()
+ labs(
title = "New deaths per million since day over 100 (highest total cases per miliion)",
x = "Day over 100", y = "Number of new cases per million")
)
Transformation introduced infinite values in continuous y-axis
LS0tCnRpdGxlOiAiQ09WSUQtMTkiCmF1dGhvcjogIlBhY2hhcmFwb2wgV2l0aGF5YXNha3B1bnQiCmRhdGU6ICI5LzEwLzIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKVG9kYXkgaXMKCmBgYHtyIHRvZGF5fQpTeXMudGltZSgpCmBgYAoKIyMgTG9hZGluZyBDT1ZJRC0xOSBkYXRhc2V0CgpgYGB7ciBsb2FkaW5nfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQoKc2V0LnNlZWQoMTIzNCkKCmZpbGVuYW1lIDwtICJjb3ZpZC5jc3YiCiNpZiAoIWZpbGUuZXhpc3RzKGZpbGVuYW1lKSkgewogIGRvd25sb2FkLmZpbGUoImh0dHBzOi8vY292aWQub3Vyd29ybGRpbmRhdGEub3JnL2RhdGEvb3dpZC1jb3ZpZC1kYXRhLmNzdiIsIGRlc3RmaWxlID0gZmlsZW5hbWUpCiN9CmNvdmlkX3JhdyA8LSByZWFkLmNzdigiY292aWQuY3N2IiwgaGVhZGVyID0gVCkKY292aWQgPC0gY292aWRfcmF3CmBgYAoKIyMgRml4IHRvdGFsX2Nhc2VzCgpgYGB7ciBmaXhfdG90YWxfY2FzZXN9CmNvdmlkJGRhdGUgPC0gYXMuRGF0ZShjb3ZpZCRkYXRlKQoKY292aWQkdG90YWxfY2FzZXNfZml4ZWQgPC0gc2FwcGx5KDE6bnJvdyhjb3ZpZCksIGZ1bmN0aW9uIChuKSB7CiAgbGFiZWwgPC0gInRvdGFsX2Nhc2VzIgogIHggPC0gY292aWRbW2xhYmVsXV1bbl0KICAKICBpZiAoaXMubmEoeCkpIHsKICAgIHRoaXNfbG9jIDwtIHN1YnNldChjb3ZpZCwgbG9jYXRpb24gPT0gY292aWQkbG9jYXRpb25bbl0pCiAgICBtIDwtIG1lYW4oYygKICAgICAgbWF4KDAsIHN1YnNldCh0aGlzX2xvYywgZGF0ZSA8IGNvdmlkJGRhdGVbbl0pW1tsYWJlbF1dLCBuYS5ybSA9IFQpLAogICAgICBtaW4obWF4KGNvdmlkW1tsYWJlbF1dLCBuYS5ybSA9IFQpLCBzdWJzZXQodGhpc19sb2MsIGRhdGUgPiBjb3ZpZCRkYXRlW25dKVtbbGFiZWxdXSwgbmEucm0gPSBUKQogICAgKSkKICAgIAogICAgaWYgKGlzLm5hKG0pKSB7CiAgICAgIHJldHVybigwKQogICAgfQoKICAgIHJldHVybihtKQogIH0KICAKICByZXR1cm4oeCkKfSkKCnNlbGVjdChzdWJzZXQoY292aWQsIGxvY2F0aW9uID09ICJUaGFpbGFuZCIpLCBsb2NhdGlvbiwgZGF0ZSwgdG90YWxfY2FzZXMsIHRvdGFsX2Nhc2VzX2ZpeGVkKQpgYGAKCiMjIEZpeCB0b3RhbF9jYXNlc19wZXJfbWlsbGlvbgoKYGBge3IgZml4X3RvdGFsX2Nhc2VzX3Blcl9taWxsaW9ufQpjb3ZpZCR0b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fZml4ZWQgPC0gc2FwcGx5KDE6bnJvdyhjb3ZpZCksIGZ1bmN0aW9uIChuKSB7CiAgbGFiZWwgPC0gInRvdGFsX2RlYXRoc19wZXJfbWlsbGlvbiIKICB4IDwtIGNvdmlkW1tsYWJlbF1dW25dCiAgCiAgaWYgKGlzLm5hKHgpKSB7CiAgICB0aGlzX2xvYyA8LSBzdWJzZXQoY292aWQsIGxvY2F0aW9uID09IGNvdmlkJGxvY2F0aW9uW25dKQogICAgbSA8LSBtZWFuKGMoCiAgICAgIG1heCgwLCBzdWJzZXQodGhpc19sb2MsIGRhdGUgPCBjb3ZpZCRkYXRlW25dKVtbbGFiZWxdXSwgbmEucm0gPSBUKSwKICAgICAgbWluKG1heChjb3ZpZFtbbGFiZWxdXSwgbmEucm0gPSBUKSwgc3Vic2V0KHRoaXNfbG9jLCBkYXRlID4gY292aWQkZGF0ZVtuXSlbW2xhYmVsXV0sIG5hLnJtID0gVCkKICAgICkpCiAgICAKICAgIGlmIChpcy5uYShtKSkgewogICAgICByZXR1cm4oMCkKICAgIH0KCiAgICByZXR1cm4obSkKICB9CiAgCiAgcmV0dXJuKHgpCn0pCgpjb3ZpZCR0b3RhbF9jYXNlc19wZXJfbWlsbGlvbl9maXhlZCA8LSBzYXBwbHkoMTpucm93KGNvdmlkKSwgZnVuY3Rpb24gKG4pIHsKICBsYWJlbCA8LSAidG90YWxfY2FzZXNfcGVyX21pbGxpb24iCiAgeCA8LSBjb3ZpZFtbbGFiZWxdXVtuXQogIAogIGlmIChpcy5uYSh4KSkgewogICAgdGhpc19sb2MgPC0gc3Vic2V0KGNvdmlkLCBsb2NhdGlvbiA9PSBjb3ZpZCRsb2NhdGlvbltuXSkKICAgIG0gPC0gbWVhbihjKAogICAgICBtYXgoMCwgc3Vic2V0KHRoaXNfbG9jLCBkYXRlIDwgY292aWQkZGF0ZVtuXSlbW2xhYmVsXV0sIG5hLnJtID0gVCksCiAgICAgIG1pbihtYXgoY292aWRbW2xhYmVsXV0sIG5hLnJtID0gVCksIHN1YnNldCh0aGlzX2xvYywgZGF0ZSA+IGNvdmlkJGRhdGVbbl0pW1tsYWJlbF1dLCBuYS5ybSA9IFQpCiAgICApKQogICAgCiAgICBpZiAoaXMubmEobSkpIHsKICAgICAgcmV0dXJuKDApCiAgICB9CgogICAgcmV0dXJuKG0pCiAgfQogIAogIHJldHVybih4KQp9KQoKc2VsZWN0KHN1YnNldChjb3ZpZCwgbG9jYXRpb24gPT0gIlRoYWlsYW5kIiksIGxvY2F0aW9uLCBkYXRlLCB0b3RhbF9kZWF0aHNfcGVyX21pbGxpb24sIHRvdGFsX2RlYXRoc19wZXJfbWlsbGlvbl9maXhlZCkKYGBgCgojIyMgTWF4IHRvdGFsIGNhc2VzLCBhcyBvZiBub3cKCmBgYHtyIG1heF90b3RhbF9jYXNlc30KZGlzdGluY3RfbG9jIDwtIGNvdmlkICU+JSBkaXN0aW5jdChsb2NhdGlvbiwgLmtlZXBfYWxsID0gVCkKCnRvdGFsX2Nhc2VzX2xvb2t1cCA8LSBkaXN0aW5jdF9sb2MkdG90YWxfY2FzZXMKbmFtZXModG90YWxfY2FzZXNfbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCm1heF90b3RhbF9jYXNlc19sb29rdXAgPC0gc2FwcGx5KGRpc3RpbmN0X2xvYyRsb2NhdGlvbiwgZnVuY3Rpb24gKGxvYykgewogIHRoaXNfbG9jIDwtIHN1YnNldChjb3ZpZCwgbG9jYXRpb24gPT0gbG9jKQogIHJldHVybihtYXgoMCwgdGhpc19sb2MkdG90YWxfY2FzZXMsIG5hLnJtID0gVCkpCn0pCgpuYW1lcyhtYXhfdG90YWxfY2FzZXNfbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCnRvdGFsX2Nhc2VzX3Blcl9taWxsaW9uX2xvb2t1cCA8LSBkaXN0aW5jdF9sb2MkdG90YWxfY2FzZXNfcGVyX21pbGxpb24KbmFtZXModG90YWxfY2FzZXNfcGVyX21pbGxpb25fbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCm1heF90b3RhbF9jYXNlc19wZXJfbWlsbGlvbl9sb29rdXAgPC0gc2FwcGx5KGRpc3RpbmN0X2xvYyRsb2NhdGlvbiwgZnVuY3Rpb24gKGxvYykgewogIHRoaXNfbG9jIDwtIHN1YnNldChjb3ZpZCwgbG9jYXRpb24gPT0gbG9jKQogIHJldHVybihtYXgoMCwgdGhpc19sb2MkdG90YWxfY2FzZXNfcGVyX21pbGxpb24sIG5hLnJtID0gVCkpCn0pCgpuYW1lcyhtYXhfdG90YWxfY2FzZXNfcGVyX21pbGxpb25fbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCnRvdGFsX2RlYXRoc19wZXJfbWlsbGlvbl9sb29rdXAgPC0gZGlzdGluY3RfbG9jJHRvdGFsX2RlYXRoc19wZXJfbWlsbGlvbgpuYW1lcyh0b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCm1heF90b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fbG9va3VwIDwtIHNhcHBseShkaXN0aW5jdF9sb2MkbG9jYXRpb24sIGZ1bmN0aW9uIChsb2MpIHsKICB0aGlzX2xvYyA8LSBzdWJzZXQoY292aWQsIGxvY2F0aW9uID09IGxvYykKICByZXR1cm4obWF4KDAsIHRoaXNfbG9jJHRvdGFsX2RlYXRoc19wZXJfbWlsbGlvbiwgbmEucm0gPSBUKSkKfSkKCm5hbWVzKG1heF90b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fbG9va3VwKSA8LSBkaXN0aW5jdF9sb2MkbG9jYXRpb24KCm1heF90b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fbG9va3VwWydUaGFpbGFuZCddCmBgYAoKIyMgRGF5IG92ZXIgMTAwCgpgYGB7ciBkYXlfb3Zlcl8xMDB9CmRhdGVfb3Zlcl8xMDBfbG9va3VwIDwtIHNhcHBseShkaXN0aW5jdF9sb2MkbG9jYXRpb24sIGZ1bmN0aW9uIChsb2MpIHsKICB0aGlzX2xvYyA8LSBzdWJzZXQoY292aWQsIGxvY2F0aW9uID09IGxvYyAmIHRvdGFsX2Nhc2VzX2ZpeGVkID49IDEwMCkKICBpZiAobGVuZ3RoKHRoaXNfbG9jJGRhdGUpID4gMCkgewogICAgcmV0dXJuKG1pbih0aGlzX2xvYyRkYXRlKSkKICB9CiAgCiAgcmV0dXJuKE5BKQp9KQoKY292aWQkZGF5X292ZXJfMTAwIDwtIHNhcHBseSgxOm5yb3coY292aWQpLCBmdW5jdGlvbiAobikgewogIGQgPC0gYXMuRGF0ZShjb3ZpZCRkYXRlW25dKSAtIGRhdGVfb3Zlcl8xMDBfbG9va3VwW1tjb3ZpZCRsb2NhdGlvbltuXV1dCiAgaWYgKGlzLm5hKGQpIHwgZCA8IDApIHsKICAgIHJldHVybihOQSkKICB9CiAgCiAgcmV0dXJuKGQpCn0pCgpzZWxlY3Qoc3Vic2V0KGNvdmlkLCAhaXMubmEoZGF5X292ZXJfMTAwKSksIGxvY2F0aW9uLCBkYXRlLCBkYXlfb3Zlcl8xMDApICU+JSBkaXN0aW5jdChsb2NhdGlvbiwgLmtlZXBfYWxsID0gVCkKYGBgCgojIyBUb3AgTidzCgpgYGB7ciB0b3Bfbl90b3RhbF9jYXNlc19wZXJfbWlsbGlvbn0KdG9wX3JhbmtzIDwtIGRhdGEuZnJhbWUoCiAgbmFtZSA9IG5hbWVzKG1heF90b3RhbF9jYXNlc19wZXJfbWlsbGlvbl9sb29rdXApLAogIG1heF90b3RhbF9jYXNlcyA9IG1heF90b3RhbF9jYXNlc19sb29rdXAsCiAgbWF4X3RvdGFsX2Nhc2VzX3Blcl9taWxsaW9uID0gbWF4X3RvdGFsX2Nhc2VzX3Blcl9taWxsaW9uX2xvb2t1cCwKICBtYXhfdG90YWxfZGVhdGhzX3Blcl9taWxsaW9uID0gbWF4X3RvdGFsX2RlYXRoc19wZXJfbWlsbGlvbl9sb29rdXAsCiAgbnRoX2Nhc2VzID0gbGVuZ3RoKG1heF90b3RhbF9jYXNlc19wZXJfbWlsbGlvbl9sb29rdXApIC0gcmFuayhtYXhfdG90YWxfY2FzZXNfcGVyX21pbGxpb25fbG9va3VwKSArIDEsCiAgbnRoX2RlYXRocyA9IGxlbmd0aChtYXhfdG90YWxfZGVhdGhzX3Blcl9taWxsaW9uX2xvb2t1cCkgLSByYW5rKG1heF90b3RhbF9kZWF0aHNfcGVyX21pbGxpb25fbG9va3VwKSArIDEKKSAlPiUgYXJyYW5nZShkZXNjKG1heF90b3RhbF9jYXNlc19wZXJfbWlsbGlvbikpCgp0b3BfcmFua3MgJT4lIHNlbGVjdChtYXhfdG90YWxfY2FzZXNfcGVyX21pbGxpb24pCmBgYAoKYGBge3IgdG9wX25fdG90YWxfZGVhdGhzX3Blcl9taWxsaW9ufQp0b3BfcmFua3MgJT4lIGFycmFuZ2UoZGVzYyhtYXhfdG90YWxfZGVhdGhzX3Blcl9taWxsaW9uKSkgJT4lIHNlbGVjdChtYXhfdG90YWxfZGVhdGhzX3Blcl9taWxsaW9uKQpgYGAKCiMjIFRoYWlsYW5kIHJhbmtzCgpgYGB7ciB0aGFpbGFuZF9yYW5rc30Kc3Vic2V0KAogIHRvcF9yYW5rcyAlPiUgYXJyYW5nZShkZXNjKG1heF90b3RhbF9jYXNlcykpLAogIG5hbWUgJWluJSAodG9wX3JhbmtzICU+JSBhcnJhbmdlKGRlc2MobWF4X3RvdGFsX2Nhc2VzKSkpJG5hbWVbMjoxMF0gfCBuYW1lID09ICJUaGFpbGFuZCIKKSAlPiUgc2VsZWN0KG50aF9jYXNlcywgbnRoX2RlYXRocywgbWF4X3RvdGFsX2Nhc2VzX3Blcl9taWxsaW9uKQpgYGAKCiMjIFRvcCBOLCBhbmQgVGhhaWxhbmQsIHNpbmNlIDEwMHRoIGRheQoKYGBge3IgcGxvdF9uZXdfY2FzZXNfcGVyX21pbGxpb259CmdncGxvdGx5KGdncGxvdCgKICBjb3ZpZCAlPiUgc3Vic2V0KCFpcy5uYShkYXlfb3Zlcl8xMDApICYgbmV3X2Nhc2VzID4gMCAmIChsb2NhdGlvbiAlaW4lIHRvcF9yYW5rc1sxOjEwLF0kbmFtZSB8IGxvY2F0aW9uID09ICJUaGFpbGFuZCIpKSwKICBhZXMoZGF5X292ZXJfMTAwLCBuZXdfY2FzZXNfcGVyX21pbGxpb24sIGNvbG9yID0gbG9jYXRpb24pKSAKICArIGdlb21fbGluZSgpIAogICsgc2NhbGVfeV9sb2cxMCgpCiAgKyBsYWJzKAogICAgdGl0bGUgPSAiTmV3IGNhc2VzIHBlciBtaWxsaW9uIHNpbmNlIGRheSBvdmVyIDEwMCAoaGlnaGVzdCB0b3RhbCBjYXNlcyBwZXIgbWlsaWlvbikiLAogICAgeCA9ICJEYXkgb3ZlciAxMDAiLCB5ID0gIk51bWJlciBvZiBuZXcgY2FzZXMgcGVyIG1pbGxpb24iKQopCmBgYAoKYGBge3IgcGxvdF9uZXdfZGVhdGhzX3Blcl9taWxsaW9ufQpnZ3Bsb3RseShnZ3Bsb3QoCiAgY292aWQgJT4lIHN1YnNldCghaXMubmEoZGF5X292ZXJfMTAwKSAmIG5ld19jYXNlcyA+IDAgJiAobG9jYXRpb24gJWluJSB0b3BfcmFua3NbMToxMCxdJG5hbWUgfCBsb2NhdGlvbiA9PSAiVGhhaWxhbmQiKSksCiAgYWVzKGRheV9vdmVyXzEwMCwgbmV3X2RlYXRoc19wZXJfbWlsbGlvbiwgY29sb3IgPSBsb2NhdGlvbikpIAogICsgZ2VvbV9saW5lKCkgCiAgKyBzY2FsZV95X2xvZzEwKCkKICArIGxhYnMoCiAgICB0aXRsZSA9ICJOZXcgZGVhdGhzIHBlciBtaWxsaW9uIHNpbmNlIGRheSBvdmVyIDEwMCAoaGlnaGVzdCB0b3RhbCBjYXNlcyBwZXIgbWlsaWlvbikiLAogICAgeCA9ICJEYXkgb3ZlciAxMDAiLCB5ID0gIk51bWJlciBvZiBuZXcgY2FzZXMgcGVyIG1pbGxpb24iKQopCmBgYAo=